#include <stdio.h>
#include <errno.h>

#include "backend-publico.h"
#include "backend-privado.h"
#include "numeros.h"
#include "../ep1.h"

/* Lê e carrega o sudoku para o arquivo */
int carrega_sudoku(char *nome)
{
	FILE *arquivo;
	int i, retorno;

	arquivo=fopen (nome, "r");
	if (arquivo == NULL)
		return 0;

	for(i=0; i<QTDE_NUMEROS; i++)
	{
		numeros[i].posicao.linha = (i / 9) + 1;
		numeros[i].posicao.coluna = (i % 9) + 1;

		retorno = fscanf(arquivo, "%u", &(numeros[i].valor));
		/* Testa por erro */
		if( retorno == EOF || retorno < 1 ) {
			errno = EINVAL;
			fclose(arquivo);
			return 0;
		}
		if (numeros[i].valor!=0)
			numeros[i].fixo = TRUE;
		else
			numeros[i].fixo = FALSE;
	}

	fclose(arquivo);
	return 1;
}

/* Retorna o valor atual de um número. Linha e coluna começam do 1 */
int pegaNumero(int linha, int coluna)
{
	int pos=(linha-1)*9 + coluna -1;

	g_assert(linha >= 1 && linha <= 9);
	g_assert(coluna >= 1 && coluna <= 9);
	return numeros[pos].valor;
}

/* Seta o valor atual de um número. Retorna FALHA caso não consiga.
 * Esta função só testa se o número é fixo. Não testa por inconsistências.
 * Linha e coluna começam do 1 */
int setaNumero(int linha, int coluna, int valor)
{
	int pos=(linha-1)*9 + coluna -1;

	g_assert(linha >= 1 && linha <= 9);
	g_assert(coluna >= 1 && coluna <= 9);
	g_assert(valor >= 0 && valor <= 9);

	if (fixo(linha,coluna)) return FALHA;
	numeros[pos].valor = valor;
	numeros_repinta(linha, coluna);
	return SUCESSO;
}

/* Retorna 1 se o número for fixo do problema.
 * Linha e coluna começam do 1  */
int fixo(int linha, int coluna)
{
	int pos=(linha-1)*9 + coluna -1;

	g_assert(linha >= 1 && linha <= 9);
	g_assert(coluna >= 1 && coluna <= 9);
	return numeros[pos].fixo;
}

/* Atualiza a tela.
 * Como é uma operação razoavelmente demorada, ela não é chamada sempre
 * que alguma coisa muda durante uma função demorada (como o resolveSudoku)
 * Você pode chama-lá se quiser ver o que está acontecendo. */
void atualizaGUI()
{
	while (gtk_events_pending ())
		gtk_main_iteration ();
}

int msgVitoria()
{
	int retorno;
	GtkWidget *dialog;

	if ((retorno=ganhou()))
	{
		atualizaGUI();
		dialog = gtk_message_dialog_new (NULL,	GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Parabéns! Problema resolvido!");
		gtk_dialog_run (GTK_DIALOG (dialog));
		gtk_widget_destroy (dialog);
	}
	return retorno;
}
